1Password Operator を使って k8s の Secret を安全に扱う
#k8s #1Password
1Password Connect Kubernetes Operator を使うと、1Password の保管庫に保存された値を k8s の Secret リソースに同期することができます
1Password/onepassword-operator: The 1Password Connect Kubernetes Operator provides the ability to integrate Kubernetes Secrets with 1Password. The operator also handles autorestarting deployments when 1Password items are updated.
先人の記事が詳しいです
KubernetesのSecretを1Passwordで管理する
1Password Connect Kubernetes Operator は Helm でも導入できます
1password-credentials.json および $OPERATOR_TOKEN (access token) は Get started with a 1Password Secrets Automation workflow | 1Password Developer Documentation に詳しい説明があります
code:console
$ helm repo add 1password https://1password.github.io/connect-helm-charts
$ helm install connect \
1password/connect \
--set-file connect.credentials=1password-credentials.json \
--set operator.create=true \
--set operator.token.value=$OPERATOR_TOKEN \
--set operator.autoRestart=true \
-n 1password \
--create-namespace
connect-helm-charts/charts/connect at main · 1Password/connect-helm-charts · GitHub
Injector もあるらしい
Inject secrets from 1Password into Kubernetes deployments | 1Password Developer Documentation
1Password のアイテムを k8s から参照する
1Password にシークレットを放り込む
「API資格情報」でも「パスワード」でも動きました
https://scrapbox.io/files/63ae96cde0d4a5001d4748b2.png
<item key> は任意文字列、マニフェストから参照するときに指定する
OnePasswordItem リソースを作る
code:secret.yaml
apiVersion: onepassword.com/v1
kind: OnePasswordItem
metadata:
name: <secret-name>
spec:
itemPath: "vaults/<vault-id-or-name>/items/<item-id-or-name>"
<secret-name> が k8s リソース名になります
<vault-id-or-name> および <item-id-or-name> は保管庫およびアイテムの ID または名前で指定します
ID は 1Password のデバッグ機能から確認できます
デバッグ機能は「設定」→「上級」→「デバッグツールを表示」から有効化できます
https://scrapbox.io/files/63ae8aad33e10e001d747dd5.png
アイテムの3点リーダーのメニューで「アイテムUUIDをコピー」すると出てくるのがアイテム ID です
https://scrapbox.io/files/63ae8b4b98d003001ea34a38.png
Secret が作られるか確認する
code:console
$ kubectl -f ./secret.yaml
$ kubectl get secret <secret-name>
Deployment から Secret を参照する
code:deployment.yaml
env:
- name: API_KEY
valueFrom:
secretKeyRef:
name: <secret-name>
key: <item-key>
トラブルシューティング
OnePasswordItem リソースを作成しても Secret が作られない
1Password のアイテムのラベルを確認してみてください
https://scrapbox.io/files/63ae87de4fc5db001d9886df.png
画像では value となっている部分です
このラベルは k8s の命名規則に従う必要があるので /[-._a-zA-Z0-9]+/ 形式になっているか確認します
日本語環境ではここが「パスワード」とか「資格情報」になる場合があり、カスタムフィールドを増やしてそこに格納する必要があります
Operator failing when creating the secret "Invalid value: \"created by\"" — 1Password Support Community